package com.sourcetrip.raw.adt.abs;

import com.sourcetrip.raw.adt.interfaces.MyBinarySearchTreeInterfaces;
import com.sourcetrip.raw.model.MyBinaryNode;
import com.sourcetrip.utils.printer.BinaryTreeInfo;


/**
 * @author: ZhouBert
 * @date: 2020/11/24
 * @description:
 */
public abstract class MyAbstractBinarySearchTree<E extends Comparable> implements MyBinarySearchTreeInterfaces<E>, BinaryTreeInfo {

	/**
	 * 哨兵节点，虚拟节点指向 root
	 * 但是跟链表又不太一样，因为不能确定左节点还是右节点，但是还是尝试一下
	 * 默认左节点
	 * 但是又遇到强制转换的问题，最好哨兵的初始化还是得放在子类中
	 * but
	 * 又遇到使用 马师的打印方法出现了 堆溢出的问题，于是先放着吧！
	 */
	//protected MyBinaryNode<E> guard = new MyBinaryNode<>(null, null);

	/**
	 * 指向 根节点
	 */
	protected MyBinaryNode<E> root;

	/**
	 * 树中的节点数量
	 */
	protected int size;

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public Object root() {
		return root;
	}

	@Override
	public Object left(Object node) {
		return ((MyBinaryNode<E>)node).getLeft();
	}

	@Override
	public Object right(Object node) {
		return ((MyBinaryNode<E>)node).getRight();
	}

	@Override
	public Object string(Object node) {
		return node;
	}
}
